thinkphp
Thinkphp使用PHP自带的ZipArchive压缩文件或文件夹
2022-07-11

一、准备工作,使用phpinfo()查看有没有zip扩展

<?php
echo phpinfo();
?>

Thinkphp使用PHP自带的ZipArchive压缩文件或文件夹(图1)


如果没有安装扩展的,请参照以下方法:


1、下载对应版本的扩展包:https://windows.php.net/downloads/pecl/releases/zip/1.13.5/,比如我是php5.6(window7_64位系统),则下载如下:


Thinkphp使用PHP自带的ZipArchive压缩文件或文件夹(图2)


2、把解压的php_zip.dll文件放到php-5.6.27-nts/ext目录


3、在php.ini添加以下配置:


extension=php_zip.dll


4、重启Apache


二、thinkphp后端控制器代码: 

/**
 ** @name='压缩'
 */
public function zip() {
	if(request()->isPost()) {
		try {
			//文件夹目录
			$dirPath=ROOT_PATH.'/demo/';
			//zip压缩包保存路径
			$zipPath= ROOT_PATH."/public/update/demo.zip";
			//创建zip实例
			$zip=new \ZipArchive();
			if($zip->open($zipPath, \ZipArchive::CREATE|\ZipArchive::OVERWRITE)=== TRUE) {
				//调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
				addFileToZip($zip,$dirPath,$dirPath);
				//关闭处理的zip文件					
				$zip->close();
			}
		}
		catch (\Exception $e) {
			$this->error('压缩失败,Error:'.$e);
		}
		$this->success('压缩成功');
	}
}
/**
 * 添加文件夹里的文件到zip
 * @param  zip   ZipArchive对象
 * @param  path  源文件夹路径
 * @param  root  源文件夹根目录
 * 补充说明:第三个参数建议和第二个参数一样,因为递归会修改第二个参数的值,因此必须传第三个参数
 */
function addFileToZip($zip,$path,$root){
    $handler=opendir($path); //打开当前文件夹
    while(($filename=readdir($handler))!==false){	
        if($filename != "." && $filename != ".."){//不操作名字为'.'和'..'的文件夹或文件
            if(is_dir($path."/".$filename)){// 如果读取的某个对象是文件夹,则递归
                addFileToZip($zip,$path."/".$filename,$root);
            }else{ 
				//将文件加入zip对象,第二个参数是zip里文件的路径
				$pathFilename=$path . "/" . $filename;
                $zip->addFile($pathFilename, str_replace($root.'/','',$pathFilename));
            }
        }
    }
    @closedir($path);
}



文章由鸿邑科技成都网站建设编辑整理,转载请注明出处!

0
分享至: